package com.zmn.mcc.dubbo.interfaces.staff;

import com.zmn.common.dto2.ResponseDTO;
import com.zmn.mcc.common.constant.DpermitConsts;
import com.zmn.mcc.common.dto.cc.CCStaffDpermitDRO;
import com.zmn.mcc.common.dto.permit.PermitLitDO;
import com.zmn.mcc.common.dto.permit.SpermitDTO;
import com.zmn.mcc.common.dto.staff.LoginStaffDO;
import com.zmn.mcc.common.dto.staff.StaffIdAndDayLimitDRO;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 员工权限服务
 *
 * @author heguanghua
 * @since 2020/06/12 00:41
 */
public interface StaffPermitRemoteService {

    /**
     * 取得员工指定系统的功能权限列表
     * 员工自定义功能权限优先，未自定义则使用所属部门默认
     *
     * @param loginStaff 员工登录验证通过后返回的对象
     * @param sysId      系统ID
     * @return 简化功能权限对象列表
     */
    SpermitDTO listPermitByLoginStaff(LoginStaffDO loginStaff, Integer sysId);

    /**
     * 取得员工指定类型的数据权限列表
     * 员工自定义数据权限优先，未自定义则使用所属部门默认
     *
     * @param loginStaff 员工登录验证通过后返回的对象
     * @param dataType   数据权限类型 {@link DpermitConsts#TYPE_ORGANIZE}
     * @param clear      返回前是否整理权限列表，可为null，为空或false则不整理
     * @return 简化的数据权限对象列表或数据权限ID列表
     */
    SpermitDTO listDpermitByLoginStaff(LoginStaffDO loginStaff, Integer dataType, Boolean clear);

    /**
     * 取得员工指定类型的数据权限列表
     * 员工自定义数据权限优先，未自定义则使用所属部门默认
     *
     * @param staffId  指定员工ID
     * @param dataType 数据权限类型 {@link DpermitConsts#TYPE_ORGANIZE}
     * @param clear    返回前是否整理权限列表，可为null，为空或false则不整理
     * @return 简化的数据权限对象列表或数据权限ID列表
     */
    SpermitDTO listDpermitByStaffId(Integer staffId, Integer dataType, Boolean clear);

    /**
     * 根据更新时间获取员工数据权限
     *
     * @param pageSize  每页条数
     * @param pageIndex 页码
     * @return ResponseDTO<List < CCRoleDRO>>
     */
    @ApiOperation(value = "根据更新时间获取员工数据权限", response = ResponseDTO.class)
    ResponseDTO<List<CCStaffDpermitDRO>> listStaffDpermitByUpdateTime(@ApiParam(value = "每页条数", required = false)
                                                                      @NotNull(message = "每页条数不能为空") Integer pageSize,
                                                                      @ApiParam(value = "页码", required = false)
                                                                      @NotNull(message = "页码不能为空") Integer pageIndex);

    /**
     * 描述: 根据员工id集合查询员工查询前溯天数
     *
     * @param staffIdList 员工id集合
     * @return List<StaffIdAndDayLimitDRO>
     * @author xujie
     * @since 2021/05/28
     **/
    @ApiOperation(value = "根据员工id集合查询员工查询前溯天数", notes = "员工id和查询前溯天数", response = StaffIdAndDayLimitDRO.class)
    ResponseDTO<List<StaffIdAndDayLimitDRO>> listStaffIdAndDayLimitByStaffIdList(@ApiParam(value = "员工id集合", required = true)
                                                                                 @NotNull(message = "员工id集合不能为空")
                                                                                 @Size(message = "员工id集合", min = 1, max = 500) List<Integer> staffIdList);

    /**
     * 描述: 查询当前登录员工 前溯天数 （通过网关接口进入）
     *
     * @return List<StaffIdAndDayLimitDRO>
     **/
    @ApiOperation(value = "根据员工id查询员工查询前溯天数", notes = "员工id和查询前溯天数", response = StaffIdAndDayLimitDRO.class)
    ResponseDTO<StaffIdAndDayLimitDRO> getCurrentLoginStaffDayLimit();


    /**
     * 取得员工指定系统的功能权限列表 （通过网关访问）
     * 员工自定义功能权限优先，未自定义则使用所属部门默认
     *
     * @param sysId 系统ID
     * @return 简化功能权限对象列表
     */
    SpermitDTO<PermitLitDO> listPermitBySysId(Integer sysId);

    /**
     * 描述: 取得员工指定系统的功能权限列表（dubbo接口访问）
     *
     * @param staffId 员工id
     * @param sysId   系统id
     * @return 简化功能权限对象列表
     * @author guoqiao
     * @since 2022/4/22 10:22
     */
    SpermitDTO<PermitLitDO> listPermitByStaffIdAndSysId(@ApiParam(value = "员工id", required = false)
                                                        @NotNull(message = "员工id不能为空") Integer staffId,
                                                        @ApiParam(value = "系统id", required = false)
                                                        @NotNull(message = "系统id不能为空") Integer sysId);


    /**
     * 描述: 根据员工ID和数据权限类型查询员工权限
     *
     * @param staffId  staffId
     * @param parentId parentId
     * @return com.zmn.common.dto2.ResponseDTO<java.util.List < com.zmn.mcc.common.dto.cc.CCStaffDpermitDRO>>
     * @author jiafei
     * @since 2022/5/24 11:14
     */
    ResponseDTO<List<CCStaffDpermitDRO>> listOrgPermitByStaffIdAndParentId(@ApiParam(value = "员工id")
                                                                           @NotNull(message = "员工id不能为空") Integer staffId,
                                                                           @ApiParam(value = "父级ID")
                                                                           @NotNull(message = "父级ID不能为空") Integer parentId);


    /**
     * 描述: 根据员工ID和组织结构ID查询员工部门权限
     *
     * @param staffId  staffId
     * @param parentId parentId
     * @return com.zmn.common.dto2.ResponseDTO<java.util.List < com.zmn.mcc.common.dto.cc.CCStaffDpermitDRO>>
     * @author jiafei
     * @since 2022/5/24 11:14
     */
    ResponseDTO<List<CCStaffDpermitDRO>> listOrgPermitByStaffIdAndParentIdAndOrgId(@ApiParam(value = "员工id")
                                                                           @NotNull(message = "员工id不能为空") Integer staffId,
                                                                           @ApiParam(value = "父级ID")
                                                                           @NotNull(message = "父级ID不能为空") Integer parentId,
                                                                           @ApiParam(value = "组织架构ID") Integer orgId);

}
